package quotation.web.ipms.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import quotation.enums.KvStoreEnum;
import quotation.web.ipms.ddd.form.impsCaculateForm;
import quotation.web.ipms.service.IpmsService;
import quotation.web.kvStore.service.KvService;
import quotation.web.personDay.service.PersonDayService;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author lyx
 * @date 2025/4/8
 */
@Slf4j
@Service
public class IpmsServiceImpl implements IpmsService {

    @Autowired
    private PersonDayService personDayService;

    @Autowired
    private KvService kvService;

    /*
        R3+0.5M+0.25N 得出有效人数 R，向上取0.5或1，例如2.13人日向上取值2.5人日，2.67人日向上取值3.0人日。
        最终给用户展示的管理费: 管理费（2000元）+最终审核人日 R*人日费（800元）+咨询费（500元）
        其中 系数0.7 、 0.5 、 0.25 、 管理费（2000元）、 人日费（800元) 、咨询费（500元） 均可配置调整
     */
    @Override
    public BigDecimal caculate(impsCaculateForm form) {
        // 计算 R1
        BigDecimal x2 = new BigDecimal(form.getX2());
        BigDecimal x3 = new BigDecimal(form.getX3());
        BigDecimal x4 = new BigDecimal(form.getX4());
        BigDecimal sum = x2.add(x3).add(x4);
        BigDecimal multiplier = new BigDecimal("0.9");
        BigDecimal result = sum.multiply(multiplier);
        BigDecimal r1 = new BigDecimal(form.getX1()).subtract(result).setScale(0, RoundingMode.CEILING);


        Integer r2 = personDayService.getValue("知识产权", r1.intValue(), null);

        BigDecimal risk = BigDecimal.ONE;
        if (form.getF() == 1) {
            String iMPSrisk = kvService.getOrDefault(KvStoreEnum.IPMS_risk);
            risk = new BigDecimal(iMPSrisk);
        }
        String fixed = kvService.getOrDefault(KvStoreEnum.IPMS_fixed_location);
        String temporary = kvService.getOrDefault(KvStoreEnum.IPMS_temporary_location);
        String manage = kvService.getOrDefault(KvStoreEnum.IPMS_manage);
        String personDay = kvService.getOrDefault(KvStoreEnum.IPMS_person_day);
        String consulting = kvService.getOrDefault(KvStoreEnum.IPMS_consulting);


        //有效人数R
        BigDecimal r = BigDecimal.valueOf(r2)
                .multiply(risk)
                .add(new BigDecimal(fixed).multiply(BigDecimal.valueOf(form.getM())))
                .add(new BigDecimal(temporary).multiply(BigDecimal.valueOf(form.getN())));

        BigDecimal R = this.roundToNearestHalfOrOne(r);

        BigDecimal total = new BigDecimal(manage)
                .add(R.multiply(new BigDecimal(personDay)))
                .add(new BigDecimal(consulting));

        return total;
    }

    //向上取0.5或1，例如2.13人日向上取值2.5人日，2.67人日向上取值3.0人日
    public BigDecimal roundToNearestHalfOrOne(BigDecimal value) {
        // 获取小数部分
        BigDecimal fractionalPart = value.remainder(BigDecimal.ONE);

        // 判断小数部分
        if (fractionalPart.compareTo(new BigDecimal("0.5")) < 0) {
            // 如果小数部分小于 0.5，向上取整到下一个 0.5
            return value.setScale(0, RoundingMode.CEILING).subtract(BigDecimal.ONE).add(new BigDecimal("0.5"));
        } else {
            // 如果小数部分大于或等于 0.5，向上取整到下一个整数
            return value.setScale(0, RoundingMode.CEILING);
        }
    }

}